package com.csu.mypetstore.api.vo;

import com.csu.mypetstore.api.entity.Item;

import java.math.BigDecimal;
import java.util.*;

public class CartVO {

    private final Map<String, CartmessageVO> itemMap = Collections.synchronizedMap(new HashMap<String, CartmessageVO>());
    private final List<CartmessageVO> itemList = new ArrayList<CartmessageVO>();

    public Iterator<CartmessageVO> getAllCartItems() {
        return itemList.iterator();
    }

    public boolean containsItemId(String itemId) {
        return itemMap.containsKey(itemId);
    }

    public void addItem(Item item, boolean isInStock) {
        CartmessageVO cartmessageVO = (CartmessageVO) itemMap.get(item.getItemId());
        if (cartmessageVO == null) {
            cartmessageVO = new CartmessageVO();
            cartmessageVO.setItem(item);
            cartmessageVO.setQuantity(0);
            cartmessageVO.setInStock(isInStock);
            itemMap.put(item.getItemId(), cartmessageVO);
            itemList.add(cartmessageVO);
        }
        cartmessageVO.incrementQuantity();
    }
    public void addCartItem(CartmessageVO cartItem){
        CartmessageVO cartItem1 = new CartmessageVO();
        cartItem1.setCartId(cartItem.getCartId());
        cartItem1.setQuantity(cartItem.getQuantity());
        cartItem1.setInStock(true);
        cartItem1.setUsername(cartItem.getUsername());
        cartItem1.setItemId(cartItem.getItemId());
        cartItem1.setListPrice(cartItem.getListPrice());
        cartItem1.setTotal(cartItem.getTotal());
        itemMap.put(cartItem1.getItemId(), cartItem1);
        itemList.add(cartItem1);
    }

    public Item removeItemById(String itemId) {
        CartmessageVO cartmessageVO = (CartmessageVO) itemMap.remove(itemId);
        if (cartmessageVO == null) {
            return null;
        } else {
            itemList.remove(cartmessageVO);
            return cartmessageVO.getItem();
        }
    }
    public CartmessageVO getCartItemById(String itemId){
        CartmessageVO cartItem = (CartmessageVO) itemMap.get(itemId);
        return cartItem;
    }
    public void incrementQuantityByItemId(String itemId) {
        CartmessageVO cartmessageVO = (CartmessageVO) itemMap.get(itemId);
        cartmessageVO.incrementQuantity();
    }

    public void setQuantityByItemId(String itemId, int quantity) {
        CartmessageVO cartItem = (CartmessageVO) itemMap.get(itemId);
        cartItem.setQuantity(quantity);
    }

    public BigDecimal getSubTotal() {
        BigDecimal subTotal = new BigDecimal("0");
        Iterator<CartmessageVO> items = getAllCartItems();
        while (items.hasNext()) {
            CartmessageVO cartItem = (CartmessageVO) items.next();
            Item item = cartItem.getItem();
            BigDecimal listPrice = item.getListPrice();
            BigDecimal quantity = new BigDecimal(String.valueOf(cartItem.getQuantity()));
            subTotal = subTotal.add(listPrice.multiply(quantity));
        }
        return subTotal;
    }

    public int getNumberOfItems() {
        return itemList.size();
    }
}
